package main

import (
	"fmt"
	"io"
	"io/ioutil"
	"net/http"
	"os"
	"path"
	"path/filepath"
	"strconv"
	"strings"

	"github.com/gin-gonic/gin"
)

func main() {
	if len(os.Args) < 2 {
		fmt.Println("参数错误，格式：[目标目录（必须）] [端口（不指定8080）]")
		os.Exit(0)
	}

	// 设置目标目录
	root, _ := filepath.Abs(os.Args[1])
	if !HavePath(root) {
		fmt.Println("目标目录不存在")
		os.Exit(0)
	}

	// 获取端口
	port := ":8080"
	if len(os.Args) > 2 {
		i, err := strconv.Atoi(os.Args[2])
		if err != nil {
			fmt.Println("端口格式错误")
			os.Exit(0)
		}

		if i < 1 || i > 63355 {
			fmt.Println("端口格式错误")
			os.Exit(0)
		}
		port = ":" + os.Args[2]
	}

	gin.SetMode(gin.ReleaseMode)
	gin.DefaultWriter = io.Discard

	r := gin.Default()

	// 绑定数据目录
	r.Static("/data", root)

	r.Static("/static", "./static")
	r.LoadHTMLGlob("./html/*")

	r.GET("/", func(ctx *gin.Context) {
		ctx.HTML(http.StatusOK, "index.html", gin.H{
			"title": "视频浏览器",
		})
	})

	r.GET("/getdir", func(ctx *gin.Context) {
		dir := ctx.Query("dir")
		if len(dir) == 0 {
			dir = root
		} else {
			dir = path.Join(root, dir)
		}

		paths, files := GetDir(dir)

		ctx.JSON(http.StatusOK, gin.H{
			"paths": paths,
			"files": files,
		})
	})

	r.Run(port)
}

// 是否有目录
func HavePath(p string) bool {
	_, err := os.Stat(p)
	return err == nil || os.IsExist(err)
}

// 是否有文件
func HaveFile(f string) bool {
	fi, e := os.Stat(f)
	if e != nil {
		return false
	}
	return !fi.IsDir()
}

// 获取当前目录下的文件夹和文件
func GetDir(d string) ([]string, []string) {
	var paths, files []string
	fi, err := ioutil.ReadDir(d)
	if err == nil {
		for _, fiTemp := range fi {
			if fiTemp.IsDir() {
				paths = append(paths, fiTemp.Name())
			} else {
				ext := strings.ToLower(filepath.Ext(fiTemp.Name()))
				if ext == ".mp4" {
					files = append(files, fiTemp.Name())
				}
			}
		}
	}
	return paths, files
}
